package com.free.utils;

import com.free.utils.enums.ENUM_DEVICE_TYPE;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class HttpUtils {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    public static String getRealIp(HttpServletRequest request){
        Stream<Supplier<String>> source = Stream.of((() -> request.getHeader("x-forwarded-for")), (() -> request.getHeader("Proxy-Client-IP")),
                (() -> request.getHeader("WL-Proxy-Client-IP")), (() -> request.getRemoteAddr()), (() -> request.getHeader("http_client_ip")),
                (() -> request.getHeader("HTTP_X_FORWARDED_FOR")));

        Optional<String> ip = source.map(s -> s.get()).filter(p -> {
            return StringUtils.isNotEmpty(p) && !"unknown".equalsIgnoreCase(p);
        }).findFirst();

        if (!ip.isPresent()) {
            return "unknown";
        }

        //如果不是多级代理则直接返回，否则返回最后一个 IP
        String[] ips = ip.get().split(",");
        return ips[ips.length - 1].trim();
    }

    public static ENUM_DEVICE_TYPE getDeviceType(HttpServletRequest request){
        String clientType = request.getHeader("clienttype");

        if ("app-ios".equalsIgnoreCase(clientType)) {
            return ENUM_DEVICE_TYPE.IOS_APP;
        }
        if ("app-android".equalsIgnoreCase(clientType)) {
            return ENUM_DEVICE_TYPE.ANDROID_APP;
        }

        String agent = request.getHeader("User-Agent");
        agent = StringUtils.defaultString(agent).toLowerCase();

        if(agent.contains("micromessenger")){
            return ENUM_DEVICE_TYPE.WECHAT;
        }

        if (!agent.contains("mobile")) {
            return ENUM_DEVICE_TYPE.PC;
        }

        if (agent.contains("android")) {
            return ENUM_DEVICE_TYPE.ANDROID_WAP;
        }

        if (agent.contains("iphone")) {
            return ENUM_DEVICE_TYPE.IOS_WAP;
        }

        return ENUM_DEVICE_TYPE.PC;
    }

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
